#include "commonuse.h"

struct S {
    int c;
    char b;
    double d;
    char arr[10];
}a;
struct S1 {
    struct S f;
    int m;
};

// int main()
// {
//     printf("%d\n", sizeof(a));//打印结果发现空间是32
//     printf("%p\n", &(a.c));//980
//     printf("%p\n", &(a.b));//984
//     printf("%p\n", &(a.d));//988
//     printf("%p\n", &(a.arr));//990.数组的对齐取决于内存数组的数据类型
//     system("pause");
//     return 0;
// }
// 出现上述结果与内存存储有关。首先，一般认为，为了提升内存运行速度
//n字节大小的变量，就会存在其地址是n字节的整数倍的地址上
//这也是为什么，c的地址是980而不是981.




//结构体变量的解释。一般结构体里面变量会有一个对齐数（简称为am（Alignment number））
//这个am取决于编译器的默认对齐数和变量字节数二者的较小值。
//同时结构体还有一个0地址为，也就是开始储存的那个地址。

//结构体里面变量的地址：1.如果是第一个变量的地址，则按照常规储存，即满足其字节数的整数倍
//                     2.其他变量在存储的时候的，取与0地址的偏移量为对齐数整数倍的地址开始储存，此时不会按照常规的储存使地址使类型字节数的整数倍
//                     3.结构体的总大小为最大对齐数的整数倍，每一个变量有对应的对齐数（注意这里是与默认对齐数计算之后得到的对齐数），在这些对齐数之中最大值
//                     4.如果存在其嵌套结构体，那么被嵌套的那个（被包含）结构体,例如上述的struct S就是，那么其作为成员的对齐数，是其内部的最大对齐数
//                     5.注意结构体没有前面变量所谓的地址整除字节。但是其有对齐数整除现象，也就是其地址必须能整除其的最大对齐数。比如把对齐值改为7（随然报错，但是可以试一下）
//                      6.同类型数组会相互分配空间，就比如char[20]就可以不去对齐，接在上一个char数组后面


//offsetof，用来计算结构体里面得变量得偏移量de宏,头文件是stddef
//%d = offsetof(结构体变量类型（不是结构体变量如a），结构体里面得变量)

// struct S {
//     int c;
//     char b;
//     double d;
//     char arr[40];
// }a;
// struct S1 {
//     struct S f;
//     int m;
// };

// int main()
// {
//     printf("%d\n", offsetof(struct S ,c));
//     printf("%d\n", offsetof(struct S ,b));//偏移量就是4
//     printf("%d\n", offsetof(struct S,arr));
//     system("pause");
//     return 0;
// }


//结构体的函数传参，一般传地址，一则，传结构体大，二则，传递至才能改变值。

